home *** CD-ROM | disk | FTP | other *** search
/ ASME's Mechanical Engine…ing Toolkit 1997 December / ASME's Mechanical Engineering Toolkit 1997 December.iso / main_frm / vi.zoo / mark.c < prev    next >
C/C++ Source or Header  |  1988-06-07  |  2KB  |  132 lines

  1. /*
  2.  * STevie - ST editor for VI enthusiasts.
  3.  *
  4.  * Extensive modifications by:  Tony Andrews       onecom!wldrdg!tony
  5.  *
  6.  */
  7.  
  8. #include "stevie.h"
  9.  
  10. #ifdef    MEGAMAX
  11. overlay "mark"
  12. #endif
  13.  
  14. /*
  15.  * This file contains routines to maintain and manipulate marks.
  16.  */
  17.  
  18. #define    NMARKS    10        /* max. # of marks that can be saved */
  19.  
  20. struct    mark {
  21.     char    name;
  22.     LPTR    pos;
  23. };
  24.  
  25. static    struct    mark    mlist[NMARKS];
  26. static    struct    mark    pcmark;        /* previous context mark */
  27. static    bool_t    pcvalid = FALSE;    /* true if pcmark is valid */
  28.  
  29. /*
  30.  * setmark(c) - set mark 'c' at current cursor position
  31.  *
  32.  * Returns TRUE on success, FALSE if no room for mark or bad name given.
  33.  */
  34. bool_t
  35. setmark(c)
  36. char    c;
  37. {
  38.     int    i;
  39.  
  40.     if (!isalpha(c))
  41.         return FALSE;
  42.  
  43.     /*
  44.      * If there is already a mark of this name, then just use the
  45.      * existing mark entry.
  46.      */
  47.     for (i=0; i < NMARKS ;i++) {
  48.         if (mlist[i].name == c) {
  49.             mlist[i].pos = *Curschar;
  50.             return TRUE;
  51.         }
  52.     }
  53.  
  54.     /*
  55.      * There wasn't a mark of the given name, so find a free slot
  56.      */
  57.     for (i=0; i < NMARKS ;i++) {
  58.         if (mlist[i].name == NUL) {    /* got a free one */
  59.             mlist[i].name = c;
  60.             mlist[i].pos = *Curschar;
  61.             return TRUE;
  62.         }
  63.     }
  64.     return FALSE;
  65. }
  66.  
  67. /*
  68.  * setpcmark() - set the previous context mark to the current position
  69.  */
  70. void
  71. setpcmark()
  72. {
  73.     pcmark.pos = *Curschar;
  74.     pcvalid = TRUE;
  75. }
  76.  
  77. /*
  78.  * getmark(c) - find mark for char 'c'
  79.  *
  80.  * Return pointer to LPTR or NULL if no such mark.
  81.  */
  82. LPTR *
  83. getmark(c)
  84. char    c;
  85. {
  86.     register int    i;
  87.  
  88.     if (c == '\'' || c == '`')    /* previous context mark */
  89.         return pcvalid ? &(pcmark.pos) : (LPTR *) NULL;
  90.  
  91.     for (i=0; i < NMARKS ;i++) {
  92.         if (mlist[i].name == c)
  93.             return &(mlist[i].pos);
  94.     }
  95.     return (LPTR *) NULL;
  96. }
  97.  
  98. /*
  99.  * clrall() - clear all marks
  100.  *
  101.  * Used mainly when trashing the entire buffer during ":e" type commands
  102.  */
  103. void
  104. clrall()
  105. {
  106.     register int    i;
  107.  
  108.     for (i=0; i < NMARKS ;i++)
  109.         mlist[i].name = NUL;
  110.     pcvalid = FALSE;
  111. }
  112.  
  113. /*
  114.  * clrmark(line) - clear any marks for 'line'
  115.  *
  116.  * Used any time a line is deleted so we don't have marks pointing to
  117.  * non-existent lines.
  118.  */
  119. void
  120. clrmark(line)
  121. LINE    *line;
  122. {
  123.     register int    i;
  124.  
  125.     for (i=0; i < NMARKS ;i++) {
  126.         if (mlist[i].pos.linep == line)
  127.             mlist[i].name = NUL;
  128.     }
  129.     if (pcvalid && (pcmark.pos.linep == line))
  130.         pcvalid = FALSE;
  131. }
  132.